home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_023 / ver30 / tty / ansi / ttykbd.c < prev   
C/C++ Source or Header  |  1992-05-06  |  4KB  |  173 lines

  1. /*
  2.  * Name:    MicroEMACS
  3.  *         Digital ANSI terminal keyboard.
  4.  *        Assumes LK201, which is OK on the VT100.
  5.  * Version:    29
  6.  * Last edit:    05-Feb-86
  7.  * By:        rex::conroy
  8.  *        decvax!decwrl!dec-rhea!dec-rex!conroy
  9.  */
  10. #include    "def.h"
  11.  
  12. #define    ESC    0x1B            /* Escape, arrows et al.    */
  13. #define    AGRAVE    0x60            /* LK201 kludge.        */
  14.  
  15. /*
  16.  * The special keys on an LK201 send back
  17.  * escape sequences of the general form <ESC>[nnn~, where
  18.  * nnn is a key code number. This table is indexed by the
  19.  * nnn code to get the key code, which is used in the
  20.  * binding table. The F4 key, and the F6 through F14 keys
  21.  * have key codes. Also F17 through F20. Think of
  22.  * help and do as special.
  23.  */
  24. short    lk201map[] = {
  25.     KRANDOM,    KFIND,        KINSERT,    KREMOVE,
  26.     KSELECT,    KPREV,        KNEXT,        KRANDOM,
  27.     KRANDOM,    KRANDOM,    KRANDOM,    KRANDOM,
  28.     KRANDOM,    KRANDOM,    KF4,        KRANDOM,
  29.     KRANDOM,    KF6,        KF7,        KF8,
  30.     KF9,        KF10,        KRANDOM,    KF11,
  31.     KF12,        KF13,        KF14,        KRANDOM,
  32.     KHELP,        KDO,        KRANDOM,    KF17,
  33.     KF18,        KF19,        KF20
  34. };
  35.  
  36. /*
  37.  * Names for the keys with basic keycode
  38.  * between KFIRST and KLAST (inclusive). This is used by
  39.  * the key name routine in "kbd.c".
  40.  */
  41. char    *keystrings[] = {
  42.     NULL,        "Up",        "Down",        "Left",
  43.     "Right",    "Find",        "Insert",    "Remove",
  44.     "Select",    "Previous",    "Next",        "F4",
  45.     "F6",        "F7",        "F8",        "F9",
  46.     "F10",        "F11",        "F12",        "F13",
  47.     "F14",        "Help",        "Do",        "F17",
  48.     "F18",        "F19",        "F20",        "PF1",
  49.     "PF2",        "PF3",        "PF4",        NULL
  50. };
  51.  
  52. /*
  53.  * Read in a key, doing the low level mapping
  54.  * of ASCII code to 11 bit code. This level deals with
  55.  * mapping the special keys into their spots in the C1
  56.  * control area. The C0 controls go right through, and
  57.  * get remapped by "getkey".
  58.  */
  59. getkbd()
  60. {
  61.     register int    c;
  62.     register int    n;
  63. loop:
  64.     c = ttgetc();
  65.     if (c == AGRAVE)            /* On LK201, grave is    */
  66.         c = METACH;            /* also META.        */
  67.     if (c == ESC) {
  68.         c = ttgetc();
  69.         if (c == '[') {
  70.             c = ttgetc();
  71.             if (c == 'A')
  72.                 return (KUP);
  73.             if (c == 'B')
  74.                 return (KDOWN);
  75.             if (c == 'C')
  76.                 return (KRIGHT);
  77.             if (c == 'D')
  78.                 return (KLEFT);
  79.             if (c>='0' && c<='9') {    /* LK201 functions.    */
  80.                 n = 0;
  81.                 do {
  82.                     n = 10*n + c - '0';
  83.                     c = ttgetc();
  84.                 } while (c>='0' && c<='9');
  85.                 if (c=='~' && n<=34) {
  86.                     c = lk201map[n];
  87.                     if (c != KRANDOM)
  88.                         return (c);
  89.                     goto loop;
  90.                 }
  91.             }
  92.             goto loop;
  93.         }
  94.         if (c == 'O') {    
  95.             c = ttgetc();
  96.             if (c == 'A')
  97.                 return (KUP);
  98.             if (c == 'B')
  99.                 return (KDOWN);
  100.             if (c == 'C')
  101.                 return (KRIGHT);
  102.             if (c == 'D')
  103.                 return (KLEFT);
  104.             if (c == 'P')
  105.                 return (KPF1);
  106.             if (c == 'Q')
  107.                 return (KPF2);
  108.             if (c == 'R')
  109.                 return (KPF3);
  110.             if (c == 'S')
  111.                 return (KPF4);
  112.             goto loop;
  113.         }
  114.         if (ISLOWER(c) != FALSE)    /* Copy the standard    */
  115.             c = TOUPPER(c);        /* META code.        */
  116.         if (c>=0x00 && c<=0x1F)
  117.             c = KCTRL | (c+'@');
  118.         return (KMETA | c);
  119.     }
  120.     return (c);
  121. }
  122.  
  123. /*
  124.  * Terminal specific keymap initialization.
  125.  * Attach the special keys to the appropriate built
  126.  * in functions. Bind all of the assigned graphics in the
  127.  * DEC supplimental character set to "ins-self".
  128.  * As is the case of all the keymap routines, errors
  129.  * are very fatal.
  130.  */
  131. ttykeymapinit()
  132. {
  133.     register SYMBOL    *sp;
  134.     register int    i;
  135.  
  136.     keydup(KFIND,    "search-again");
  137.     keydup(KHELP,    "help");
  138.     keydup(KINSERT, "yank");
  139.     keydup(KREMOVE, "kill-region");
  140.     keydup(KSELECT, "set-mark");
  141.     keydup(KPREV,    "back-page");
  142.     keydup(KNEXT,    "forw-page");
  143.     keydup(KDO,    "execute-macro");
  144.     keydup(KF17,    "back-window");
  145.     keydup(KF18,    "forw-window");
  146.     keydup(KF19,    "enlarge-window");
  147.     keydup(KF20,    "shrink-window");
  148.     keydup(KUP,    "back-line");
  149.     keydup(KDOWN,    "forw-line");
  150.     keydup(KRIGHT,    "forw-char");
  151.     keydup(KLEFT,    "back-char");
  152.  
  153.     /*
  154.      * Bind all GR positions that correspond
  155.      * to assigned characters in the Digital multinational
  156.      * character set to "ins-self". These characters may
  157.      * be used just like any other character.
  158.      */
  159.  
  160.     if ((sp=symlookup("ins-self")) == NULL)
  161.         abort();
  162.     for (i=0xA0; i<0xFF; ++i) {
  163.         if (i!=0xA4 && i!=0xA6 && i!=0xAC && i!=0xAD && i!=0xAE
  164.         &&  i!=0xAF && i!=0xB4 && i!=0xB8 && i!=0xBE && i!=0xF0
  165.         &&  i!=0xFE && i!=0xA0) {
  166.             if (binding[i] != NULL)
  167.                 abort();
  168.             binding[i] = sp;
  169.             ++sp->s_nkey;
  170.         }
  171.     }
  172. }
  173.